package ca.etsmtl.gti785.servlet;

import java.io.File;
import java.util.ArrayList;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import ca.etsmtl.gti785.servlet.Interfaces.IFileList;
import ca.etsmtl.gti785.util.Constants;
import ca.etsmtl.gti785.util.Fichier;

/**
 * This class contains the call tree "/server/fileList". It has a GET who gets all the files of the server. The DELETE is not implemented.
 * @author Étienne Faucher
 */
@Path("/fileList")
public class FileList implements IFileList 
{
	@Override
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	public String getFileList() 
	{
		Fichier sharedFolder = getFichiers(Constants.Shared_Folder, "/", true);
		return sharedFolder.toJSON();
	}
	
	@Override
	@DELETE
	@Produces(MediaType.APPLICATION_JSON)
	public String deleteFileList(@QueryParam("fileList") String fileList) 
	{
		// TODO Not implemented method.
		return null;
	}
	
	private Fichier getFichiers(String path, String pathToGo, boolean isRoot) 
	{
		try
		{
			File root = new File(path);
	        File[] list = root.listFiles();

	        if (list == null) return null;

	        Fichier fichier = null;
	        StringBuilder sb = new StringBuilder(pathToGo);
	        if(!isRoot && root.isDirectory())
	        {
		        sb.append(root.getName());
	        }
	        
	        if(root.isDirectory())
	        {
	            fichier = new Fichier(root.isDirectory(), root.getName(), sb.toString());
	        }

	        if(!isRoot && root.isDirectory())
	        {
		        sb.append("/");
	        }

	        ArrayList<Fichier> fichiers = new ArrayList<Fichier>();
	        for ( File f : list ) 
	        {
	            if ( f.isDirectory() ) 
	            {
	            	fichiers.add(getFichiers(f.getAbsolutePath(), sb.toString(), false));
	            }
	            else 
	            {
	            	fichiers.add(new Fichier(false, f.getName(), sb.toString() + f.getName()));
	            }
	        }
	        
	        fichier.listFichiers = fichiers;
	        
	        return fichier;
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
		
		return null;
	}
}
